const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const BearerStrategy = require('passport-http-bearer').Strategy
const jwt = require('jsonwebtoken')
const _ = require('lodash')
const { jwt_config } = require('../config/jwt')

/**********初始化passport框架********** */
module.exports.setup = function (app, loginFunc, callback) {
    // 配置应用程序登录使用的策略(用户名、密码)
    passport.use(new LocalStrategy(
        // https://github.com/jaredhanson/passport-local
        function(username, password, done) {
            if (!loginFunc) return done('登录验证函数未设置')

            //  console.log(username, password, 'passport先接收参数')
            
            loginFunc(username, password, function(err, user) {
                if (err) return done(err)
                return done(null, user)
            })
        }
    ))

    // 配置token 验证策略
    passport.use(new BearerStrategy(
        // https://github.com/jaredhanson/passport-http-bearer
        function (token, done) {
            // console.log('token', token)
            // 验证token(如果签名有效并且可选的到期时间、受众或发行者有效，则使用解码的有效负载调用回调)
            jwt.verify(token, jwt_config.secretKey, function (err, decoded) {
                if (err) return done('token验证错误')
                // console.log('decoded', decoded)
                return done(null, decoded)
            })
        }
    ))

    // 每个请求进来都会被调用
    app.use(passport.initialize())

    if (callback) callback()
}


/************ 登录验证逻辑**************/

module.exports.login = function(req, res, next) {
    // 只有在路由中使用了passport.authenticate 中间件才会调用 登录验证策略
    passport.authenticate('local', function (err, user, info) {
        if (err) {
            return res.sendResult(null, 400, err)
        }
        if (!user) {
            return res.sendResult(null, 400, '参数错误')
        }
        // console.log('user', user)
        // https://github.com/auth0/node-jsonwebtoken
        const token = jwt.sign({
            uid: user.id,
            rid: user.rid
        },
        jwt_config.secretKey,
        {
            expiresIn: jwt_config.expiresIn
        })
        // 将验证信息放在响应头里返回
        res.setHeader('Authorization', 'Bearer ' + token)
        return res.sendResult([user], 200,'登录成功')
    })(req, res, next)
}

/*********全局请求token验证**********/
module.exports.tokenAuth = function (req,res,next) {
    // console.log('先拦截所有请求 验证token')
    // 取请求头里的Authorization信息
	passport.authenticate('bearer', { session: false }, function (err,tokenData) {
		if(err) return res.sendResult(null, 400, '无效token');
		if(!tokenData) return res.sendResult(null, 400 ,'无效token');
		req.userInfo = {};
		req.userInfo.uid = tokenData["uid"];
		req.userInfo.rid = tokenData["rid"];
        // console.log(req.userInfo, 'req')
		next();
	})(req, res, next);
}